package cn.jingyuan.owl.utils.core.getter;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;

/**
 * 可选默认值的基本类型的 getter 接口<br>
 * 提供一个统一的接口定义返回不同类型的值（基本类型）<br>
 * 如果值不存在或获取错误，返回默认值
 */
public interface OptBasicTypeGetter<K> {

    /**
     * 获取 Object 属性值
     *
     * @param key 属性名
     * @param defaultValue 默认值
     *
     * @return 属性值，无对应值返回 defaultValue
     */
    Object getObject(K key, Object defaultValue);

    /**
     * 获取 String 型属性值<br>
     * 若获得的值为不可见字符，使用默认值
     *
     * @param key 属性名
     * @param defaultValue 默认值
     *
     * @return 属性值，无对应值返回 defaultValue
     */
    String getString(K key, String defaultValue);

    /**
     * 获取 Integer 型属性值<br>
     * 若获得的值为不可见字符，使用默认值
     *
     * @param key 属性名
     * @param defaultValue 默认值
     *
     * @return 属性值，无对应值返回 defaultValue
     */
    Integer getInteger(K key, Integer defaultValue);

    /**
     * 获取 Short 型属性值<br>
     * 若获得的值为不可见字符，使用默认值
     *
     * @param key 属性名
     * @param defaultValue 默认值
     *
     * @return 属性值，无对应值返回 defaultValue
     */
    Short getShort(K key, Short defaultValue);

    /**
     * 获取 Boolean 型属性值<br>
     * 若获得的值为不可见字符，使用默认值
     *
     * @param key 属性名
     * @param defaultValue 默认值
     *
     * @return 属性值，无对应值返回 defaultValue
     */
    Boolean getBoolean(K key, Boolean defaultValue);

    /**
     * 获取 Long 型属性值<br>
     * 若获得的值为不可见字符，使用默认值
     *
     * @param key 属性名
     * @param defaultValue 默认值
     *
     * @return 属性值，无对应值返回 defaultValue
     */
    Long getLong(K key, Long defaultValue);

    /**
     * 获取 Character 型属性值<br>
     * 若获得的值为不可见字符，使用默认值
     *
     * @param key 属性名
     * @param defaultValue 默认值
     *
     * @return 属性值，无对应值返回 defaultValue
     */
    Character getCharacter(K key, Character defaultValue);

    /**
     * 获取 Float 型属性值<br>
     * 若获得的值为不可见字符，使用默认值
     *
     * @param key 属性名
     * @param defaultValue 默认值
     *
     * @return 属性值，无对应值返回 defaultValue
     */
    Float getFloat(K key, Float defaultValue);

    /**
     * 获取 Double 型属性值<br>
     * 若获得的值为不可见字符，使用默认值
     *
     * @param key 属性名
     * @param defaultValue 默认值
     *
     * @return 属性值，无对应值返回 defaultValue
     */
    Double getDouble(K key, Double defaultValue);

    /**
     * 获取 Byte 型属性值<br>
     * 若获得的值为不可见字符，使用默认值
     *
     * @param key 属性名
     * @param defaultValue 默认值
     *
     * @return 属性值，无对应值返回 defaultValue
     */
    Byte getByte(K key, Byte defaultValue);

    /**
     * 获取 BigDecimal 型属性值<br>
     * 若获得的值为不可见字符，使用默认值
     *
     * @param key 属性名
     * @param defaultValue 默认值
     *
     * @return 属性值，无对应值返回 defaultValue
     */
    BigDecimal getBigDecimal(K key, BigDecimal defaultValue);

    /**
     * 获取 BigInteger 型属性值<br>
     * 若获得的值为不可见字符，使用默认值
     *
     * @param key 属性名
     * @param defaultValue 默认值
     *
     * @return 属性值，无对应值返回 defaultValue
     */
    BigInteger getBigInteger(K key, BigInteger defaultValue);

    /**
     * 获得 Enum 类型的值
     *
     * @param <E> 枚举类型
     * @param clazz Enum 的 Class
     * @param key KEY
     * @param defaultValue 默认值
     *
     * @return Enum 类型的值，无则返回 Null
     */
    <E extends Enum<E>> E getEnum(Class<E> clazz, K key, E defaultValue);

    /**
     * 获取 Date 类型值
     *
     * @param key 属性名
     * @param defaultValue 默认值
     *
     * @return Date 类型属性值
     */
    Date getDate(K key, Date defaultValue);

}
